package com.passion.fs.config;

import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Configuration
public class TokenExpiredInterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册拦截器，排除不需要拦截的路径（例如登录接口）
        registry.addInterceptor(new TokenExpiredInterceptor())
                .addPathPatterns("/**") // 拦截所有路径
                .excludePathPatterns(   // 排除登录接口和公共资源
                        "/login",
                        "/logout",
                        "/sys/user/doLogin",
                        "/common/**",
                        "/assets/**"
                );
    }

    // 自定义拦截器类
    private static class TokenExpiredInterceptor implements HandlerInterceptor {

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 检查token是否有效
            if (!StpUtil.isLogin()) {
                // 如果未登录或者Token已过期，设置响应状态码为401
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                // 判断是否为document请求
                boolean isDocumentRequest = "GET".equalsIgnoreCase(request.getMethod())
                        && (request.getHeader("X-Requested-With") == null || !"XMLHttpRequest".equals(request.getHeader("X-Requested-With")))
                        && request.getHeader("Accept").contains("text/html");
                // 如果是document类型请求时页面跳转到登录页面; 其他类型（如xhr）则由前端捕捉处理跳转
                if (isDocumentRequest) {
                    // 创建一个表示登录过期的Cookie
                    Cookie loginExpiredCookie = new Cookie("loginExpired", "true");
                    // 设置Cookie的生命周期（例如：2分钟）
                    loginExpiredCookie.setMaxAge(60 * 2); // 以秒为单位
                    // 将Cookie添加到响应中
                    response.addCookie(loginExpiredCookie);
                    response.sendRedirect(request.getContextPath() + "/login");
                }
                return false;
            }
            // 如果token有效则继续执行下一个拦截器或者目标方法
            return true;
        }
    }
}